
/*
 * 版权声明 (c) 2025 XXX科技有限公司
 *
 * 本软件及其相关文档文件受版权保护。未经版权所有者明确书面许可，任何单位或个人不得
 * 以任何形式复制、传播、修改、出售、出租、反向工程、反编译或利用本软件的任何部分。
 *
 * 对于任何违反本声明的行为，版权所有者保留追究法律责任的权利。
 */

#ifndef __ADDRESS_H__
#define __ADDRESS_H__
#include <string>
#include <functional>
#include "utils/header_sock.h"

using namespace std;

#pragma pack(push, 1)
struct Address {
	uint32_t ip;   // 网络字节序
	uint16_t port; // 网络字节序

	string ip_str() {
		char           buffer[INET_ADDRSTRLEN];
		struct in_addr addr;
		addr.s_addr = htonl(ip);
		if (inet_ntop(AF_INET, &addr, buffer, sizeof(buffer)) != nullptr) {
			return string(buffer);
		}
		return "";
	};

	string addr() {
		auto port_str = static_cast<int>(port);
		return ip_str() + ":" + to_string(port_str);
	}
};

inline Address createAddress(const char *ip, const uint16_t port) {
	struct in_addr addr;
	if (inet_pton(AF_INET, ip, &addr) != 1) {
		throw runtime_error("ip error");
	}

	Address result;
	result.ip   = ntohl(addr.s_addr);
	result.port = port;
	return result;
};
#pragma pack(pop)

#endif // __ADDRESS_H__
